package com.reformer.commons.utils;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * <li>如果当前线程池中的线程数目小于corePoolSize，则每来一个任务，就会创建一个线程去执行这个任务；
 * <li>如果当前线程池中的线程数目>=corePoolSize，则每来一个任务，会尝试将其添加到任务缓存队列当中，若添加成功，则该任务会等待空闲线程将其取出去执行；若添加失败（一般来说是任务缓存队列已满），则会尝试创建新的线程去执行这个任务；
 * <li>如果当前线程池中的线程数目达到maximumPoolSize，则会采取任务拒绝策略进行处理；
 * <li>如果线程池中的线程数量大于 corePoolSize时，如果某线程空闲时间超过keepAliveTime，线程将被终止，直至线程池中的线程数目不大于corePoolSize；如果允许为核心池中的线程设置存活时间，那么核心池中的线程空闲时间超过keepAliveTime，线程也会被终止。
 *
 * @author sdc
 */
public class ThreadPoolUtils {

    private static ThreadPoolExecutor executor;

    private synchronized static void init() {
        try {
            if (executor == null) {
                executor = new ThreadPoolExecutor(5, 30, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1000));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将任务加入线程池并执行
     *
     * @param command 任务
     */
    public static void execute(Runnable command) {
        if (executor == null) {
            init();
        }
        executor.execute(command);
    }
}
